package com.ruoyi.system.outto.goods.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.V2.gameAttr.mapper.GameAttrTemplateMapper;
import com.ruoyi.system.V2.gameAttr.mapper.GameAttributeMapper;
import com.ruoyi.system.V2.goodInfo.mapper.GoodsInfoImgMapper;
import com.ruoyi.system.V2.inter.mapper.ArtRecMapper;
import com.ruoyi.system.interAttr.domain.InterAttr;
import com.ruoyi.system.interAttr.mapper.InterAttrMapper;
import com.ruoyi.system.model.domain.ArtRec;
import com.ruoyi.system.model.domain.GameAttrTemplate;
import com.ruoyi.system.model.domain.GoodsInfoImg;
import com.ruoyi.system.model.domain.SalePartner;
import com.ruoyi.system.model.dto.GoodsInfoAndAttrValueDto;
import com.ruoyi.system.outto.core.MapUntils;
import com.ruoyi.system.outto.goods.NEWCYTAPI;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author lz
 * @version 1.0
 * @date 2022/6/5 16:19
 */
@Slf4j
@Service
public class NEWCYTAPIImpl implements NEWCYTAPI {

    @Resource
    private GameAttrTemplateMapper gameAttrTemplateMapper;
    @Resource
    private GameAttributeMapper gameAttributeMapper;
    @Resource
    private GoodsInfoImgMapper goodsInfoImgMapper;
    @Resource
    private ArtRecMapper artRecMapper;
    @Resource
    InterAttrMapper interAttrMapper;


    @Override
    public AjaxResult addGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        String path = "http://new.cytds.com/api/publish";
        Map<String, Object> result = new HashMap<>();
        Map<String, Object> params = params(goodsInfoAndAttrValueDto, salePartner);
        log.info("畅游堂添加接口请求参数={}", JSONObject.toJSONString(params));
        String response = HttpUtils.sendPost(path, JSONObject.toJSONString(params), "application/json");
        log.info("畅游堂添加接口返回参数={}", MapUntils.unicodeToString(response));
        JSONObject resultJson = JSONObject.parseObject(response);
        if (!"true".equals(resultJson.getString("state"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
            result.put("outId", String.valueOf(goodsInfoAndAttrValueDto.getId()));
            upper(String.valueOf(goodsInfoAndAttrValueDto.getId()),salePartner);
        }

        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        result.put("msg", MapUntils.unicodeToString(response));
        return AjaxResult.success(result);
    }

    @Override
    public AjaxResult editGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        String path = "http://new.cytds.com/api/publish";
        Map<String, Object> result = new HashMap<>();
        Map<String, Object> params = params(goodsInfoAndAttrValueDto, salePartner);
        log.info("畅游堂编辑接口请求参数={}", JSONObject.toJSONString(params));
        String response = HttpUtils.sendPost(path, JSONObject.toJSONString(params), "application/json");
        log.info("畅游堂编辑接口返回参数={}", MapUntils.unicodeToString(response));
        JSONObject resultJson = JSONObject.parseObject(response);
        if (!"true".equals(resultJson.getString("state"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
        }
        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        result.put("msg", MapUntils.unicodeToString(response));
        return AjaxResult.success(result);
    }

    private Map<String, Object> params(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {

        Map<String, Object> params = new HashMap<>();
        params.put("key", salePartner.getSaleKey());
        params.put("secret", salePartner.getOther());
        params.put("my_code", goodsInfoAndAttrValueDto.getId());
        params.put("title", goodsInfoAndAttrValueDto.getDes());
        params.put("sale_price", goodsInfoAndAttrValueDto.getPrice());
        params.put("account", goodsInfoAndAttrValueDto.getAccountNumber());
        params.put("img", goodsInfoAndAttrValueDto.getTitleImg());
        GoodsInfoImg goodsInfoImg = new GoodsInfoImg();
        goodsInfoImg.setGoodsId(goodsInfoAndAttrValueDto.getId());
        goodsInfoImg.setType(Constants.STR_1);
        List<GoodsInfoImg> infoImgs = goodsInfoImgMapper.selectGoodsInfoImgList(goodsInfoImg);
        params.put("imgs", infoImgs.stream().map(info -> info.getImgUrl()).collect(Collectors.toList()).stream().collect(Collectors.joining(",")));

        //自动匹配属性
        String substring = salePartner.getSaleName().substring(salePartner.getSaleName().indexOf("_")+1);
        InterAttr interAttr = interAttrMapper.selectInterAttrByConfig(substring, goodsInfoAndAttrValueDto.getGameId());
        params.put("game_id",interAttr.getInterGameId());
        List<JSONObject> attr = new ArrayList<>();
        //区服
        JSONObject area = new JSONObject();
        JSONObject server = new JSONObject();
        String attrs = getAttrs(interAttr.getInterGameId());
        String data = JSONObject.parseObject(attrs).getString("data");
        JSONArray jsonArray = JSONArray.parseArray(data);
        JSONObject jsonObject = JSONObject.parseObject(jsonArray.get(0).toString());
        if(goodsInfoAndAttrValueDto.getGameType().equals("0")){
            String regional = goodsInfoAndAttrValueDto.getSystemName()+goodsInfoAndAttrValueDto.getCarrierName();
            String children = jsonObject.getString("children");
            JSONArray jsonArray1 = JSONArray.parseArray(children);
            for(Object p : jsonArray1){
                if(JSONObject.parseObject(p.toString()).getString("name").equals(regional)){
                    area.put("id",jsonObject.getString("id"));
                    area.put("val",JSONObject.parseObject(p.toString()).getString("id"));
                    attr.add(area);
                    break;
                }
            }
        }else {
            String children = jsonObject.getString("children");
            if(goodsInfoAndAttrValueDto.getGameName().equals("无畏契约")){
                area.put("id",15797);
                area.put("val",15799);
                attr.add(area);
            }else {
                JSONArray jsonArray1 = JSONArray.parseArray(children);
                for (Object p : jsonArray1) {
                    if (JSONObject.parseObject(p.toString()).getString("name").equals(goodsInfoAndAttrValueDto.getGroupName())) {
                        String children1 = JSONObject.parseObject(p.toString()).getString("children");
                        JSONArray jsonArray2 = JSONArray.parseArray(children1);
                        for (Object q : jsonArray2) {
                            if (JSONObject.parseObject(q.toString()).getString("name").equals(goodsInfoAndAttrValueDto.getServerName())) {
                                area.put("id", jsonObject.getString("id"));
                                area.put("val", JSONObject.parseObject(p.toString()).getString("id"));
                                attr.add(area);
                                server.put("id", JSONObject.parseObject(p.toString()).getString("id"));
                                server.put("val", JSONObject.parseObject(q.toString()).getString("id"));
                                attr.add(server);
                                break;
                            }
                        }
                    }
                }
            }
        }


        //开始匹配单选属性
        builderRadioAttr(goodsInfoAndAttrValueDto,interAttr.getRadioAttr(),attr);
        //开始匹配多选属性
        builderCheckAttr(goodsInfoAndAttrValueDto,interAttr.getCheckAttr(),attr);
        //开始匹配输入框属性
        builderInputAttr(goodsInfoAndAttrValueDto,interAttr.getInputAttr(),attr);
        params.put("attr", attr);
        return params;
    }

    /**
     * 开始匹配输入框属性
     *
     * @param goodsInfoAndAttrValueDto
     * @param inputAttr
     */
    private void builderInputAttr(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, String inputAttr, List<JSONObject> attr) {
//        JSONArray propertys = Objects.isNull(params.get("property")) ? new JSONArray() : JSONArray.parseArray(params.get("property").toString());
        Field[] declaredFields = goodsInfoAndAttrValueDto.getClass().getDeclaredFields();

        //========================开始匹配输入框=====================//
        JSONObject jsonObject1 = JSONObject.parseObject(inputAttr);
        String inputJson = jsonObject1.getString("inputJson");
        List<JSONObject> jsonObjects1 = JSONObject.parseArray(inputJson, JSONObject.class);
        GameAttrTemplate gameAttrTemplate = new GameAttrTemplate();
        gameAttrTemplate.setGameId(goodsInfoAndAttrValueDto.getGameId());
        gameAttrTemplate.setIsEnable("0");
        ArrayList types = new ArrayList<>();
        types.add("number");
        types.add("input");
        gameAttrTemplate.setFieldTypes(types);
        List<GameAttrTemplate> inputTemplates = gameAttrTemplateMapper.selectGameAttrTemplateList(gameAttrTemplate);
        List<JSONObject> defInputObjects = new ArrayList<>();
        defInputObjects.addAll(jsonObjects1);
        for (JSONObject object : jsonObjects1) {
            for (GameAttrTemplate inputTemplate : inputTemplates) {
                JSONObject att = new JSONObject();
                String aavName = inputTemplate.getAavName();
                if (Objects.equals(object.getString("aavName"), inputTemplate.getAavName())) {
                    defInputObjects.remove(object);
                    String id = object.getString("id");
                    for (Field declaredField : declaredFields) {
                        String name = declaredField.getName();
                        if (Objects.equals(aavName, name)) {
                            declaredField.setAccessible(true);
                            Object o = null;
                            try {
                                o = declaredField.get(goodsInfoAndAttrValueDto);
                            } catch (IllegalAccessException e) {
                                throw new GlobalException("3属性参数错误，请匹配后重新配置");
                            }
                            String oneValue = String.valueOf(o);
                            if (StringUtils.isNotEmpty(oneValue)) {
                                att.put("id",id);
                                att.put("val",oneValue);
                                attr.add(att);
                            }
                        }
                    }
                }
            }
        }
        //开始匹配默认值
        for (JSONObject object : defInputObjects) {
            String id = object.getString("id");
            String defaultValue = object.getString("defaultValue");
            if (StringUtils.isNotEmpty(defaultValue)) {
                JSONObject att = new JSONObject();
                att.put("id",id);
                att.put("val",defaultValue);
                attr.add(att);
            }
        }
    }

    private void builderCheckAttr(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, String checkAttr, List<JSONObject> attr) {
        /**
         * 1、先查询自定义中所有多选的字段
         * 2、再查该账号单选字段中的选项
         * 3、再去接口属性匹配表过滤
         */
        Field[] declaredFields = goodsInfoAndAttrValueDto.getClass().getDeclaredFields();
        JSONObject checkAttrJson = JSONObject.parseObject(checkAttr);
        String interCheckBoxReqs = checkAttrJson.getString("interCheckBoxReqs");
        List<JSONObject> checkJsonList = JSONObject.parseArray(interCheckBoxReqs, JSONObject.class);
        if (org.springframework.util.CollectionUtils.isEmpty(checkAttrJson)) {
            throw new GlobalException("接口多选属性暂未配置");
        }

        GameAttrTemplate gameAttrTemplate = new GameAttrTemplate();
        gameAttrTemplate.setGameId(goodsInfoAndAttrValueDto.getGameId());
        gameAttrTemplate.setIsEnable("0");
        List<String> types = new ArrayList<>();
        types.add("checkbox");
        types.add("boxradio");
        gameAttrTemplate.setFieldTypes(types);
        List<GameAttrTemplate> checkAttrTemplates = gameAttrTemplateMapper.selectGameAttrTemplateList(gameAttrTemplate);

        for (JSONObject object : checkJsonList) {
            String pf_ids = "";
            for (GameAttrTemplate attrTemplate : checkAttrTemplates) {

                String aavName = attrTemplate.getAavName();
                for (Field declaredField : declaredFields) {
                    String name = declaredField.getName();
                    if (aavName.equals(name)) {
                        declaredField.setAccessible(true);

//                        List<String> list2 = new ArrayList<>();
//                        for (String s : split2) {
//                            s = s.replace(" ", "");
//                            list2.add(s);
//                        }
                        Object o = null;
                        try {
                            o = declaredField.get(goodsInfoAndAttrValueDto);
                        } catch (IllegalAccessException e) {
                            throw new GlobalException("多选项" + attrTemplate.getFieldName() + "匹配错误");
                        }
                        String oneValue = String.valueOf(o);
                        String interCheckBoxReqsStr = object.getString("interCheckBoxReqs");
                        //开始匹配二级属性
                        List<JSONObject> jsonObjects2 = JSONObject.parseArray(interCheckBoxReqsStr, JSONObject.class);
                        /**
                         * 咱们的f字段  多选项都是用空格 隔开，用,号切割数组，跟匹配的数据匹配、匹配上说明此账号勾选的有此属性
                         */

                        for (JSONObject jsonObject1 : jsonObjects2) {
                            String[] split1 = oneValue.split(",");
                            String ydConfigId1 = jsonObject1.getString("YdConfigId");
                            for (String s : split1) {
                                if (Objects.equals(s, ydConfigId1)) {
                                    String InterConfigId2 = jsonObject1.getString("InterConfigId");
                                    pf_ids+=","+InterConfigId2;
                                }
                            }
                        }

                    }
                }
            }
            if (StringUtils.isNotEmpty(pf_ids)) {
                JSONObject att = new JSONObject();
                att.put("id", object.getString("id"));
                att.put("val", pf_ids.substring(1));
                attr.add(att);
            }
        }
    }

    /**
     * 开始匹配单选属性
     *
     * @param goodsInfoAndAttrValueDto
     * @param radioAttr
     */
    private void builderRadioAttr(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, String radioAttr, List<JSONObject> attr) {
        //========================开始匹配单选属性=====================//
        JSONObject jsonObject = JSONObject.parseObject(radioAttr);
        String interRadioReqs = jsonObject.getString("interRadioReqs");
        log.info(JSONObject.toJSONString(interRadioReqs));
        List<JSONObject> jsonObjects = JSONObject.parseArray(interRadioReqs, JSONObject.class);
        if (org.springframework.util.CollectionUtils.isEmpty(jsonObjects)) {
            throw new GlobalException("接口单选属性暂未配置");
        }
        /**
         * 1、先查询自定义中所有单选的字段
         * 2、再查该账号单选字段中的选项
         * 3、再去接口属性匹配表过滤
         */
        GameAttrTemplate gameAttrTemplate = new GameAttrTemplate();
        gameAttrTemplate.setGameId(goodsInfoAndAttrValueDto.getGameId());
        gameAttrTemplate.setIsEnable("0");
        gameAttrTemplate.setFieldType("radio");
        List<GameAttrTemplate> gameAttrTemplates = gameAttrTemplateMapper.selectGameAttrTemplateList(gameAttrTemplate);
        Field[] declaredFields = goodsInfoAndAttrValueDto.getClass().getDeclaredFields();


        List<JSONObject> defObjects = new ArrayList<>();
        defObjects.addAll(jsonObjects);
        for (JSONObject object : jsonObjects) {
            for (GameAttrTemplate attrTemplate : gameAttrTemplates) {
                JSONObject att = new JSONObject();
                String aavName = attrTemplate.getAavName();
                for (Field declaredField : declaredFields) {
                    String name = declaredField.getName();
                    if (aavName.equals(name)) {
                        //一级属性
                        //注意 YdConfigId 对应的是 f字段对应的 id
                        if (Objects.equals(object.getLong("YdConfigId"), attrTemplate.getId())) {
                            String id = object.getString("id");
                            defObjects.remove(object);//如果匹配上，则去掉
                            String interRadioReqs1 = object.getString("interRadioReqs");
                            List<JSONObject> jsonObjects2 = JSONObject.parseArray(interRadioReqs1, JSONObject.class);
                            declaredField.setAccessible(true);
                            try {
                                //获取选择的值 例如  实名中的可二次
                                Object o = declaredField.get(goodsInfoAndAttrValueDto);
                                String oneValue = String.valueOf(o);
                                List<JSONObject> twoAttr = jsonObjects2.stream().filter(j -> StringUtils.isNotEmpty(j.getString("YdConfigId"))?j.getString("YdConfigId").contains(oneValue):"111".contains(oneValue)).collect(Collectors.toList());
                                String defaultValue = object.getString("defaultValue");
                                if (org.springframework.util.CollectionUtils.isEmpty(twoAttr)) {
                                    if (StringUtils.isNotEmpty(defaultValue)) {
                                        att.put("id", id);
                                        att.put("val", defaultValue);
                                        attr.add(att);
                                    }
                                }
//                                if (org.springframework.util.CollectionUtils.isEmpty(twoAttr) && StringUtils.isEmpty(defaultValue)) {
//                                    throw new GlobalException("属性" + interConfigName + " 接口要求必传，但是暂未匹配到，请设置默认值");
//                                }
                                if (!org.springframework.util.CollectionUtils.isEmpty(twoAttr)) {
                                    JSONObject jsonObject2 = twoAttr.get(0);
                                    String interConfigId2 = jsonObject2.getString("InterConfigId");
                                    att.put("id", id);
                                    att.put("val", interConfigId2);
                                    attr.add(att);
                                }
                            } catch (Exception e) {
                                throw new GlobalException("单选项" + attrTemplate.getFieldName() + "匹配错误");
                            }
                        }
                    }
                }
            }
        }
        //开始匹配默认值
        for (JSONObject object : defObjects) {
            JSONObject att = new JSONObject();
            String id = object.getString("id");
            interRadioReqs = object.getString("interRadioReqs");
            jsonObjects = JSONObject.parseArray(interRadioReqs, JSONObject.class);
            for (JSONObject objects : jsonObjects) {
                if(StringUtils.isNotEmpty(objects.getString("defaultValue"))){
                    att.put("id", id);
                    att.put("val", objects.getString("defaultValue"));
                    attr.add(att);
                }
            }
        }
        //========================单选属性匹配结束=====================//
    }


    @Override
    public AjaxResult delGame(GoodsInfoAndAttrValueDto goodsInfoAndAttrValueDto, SalePartner salePartner) {
        ArtRec artRecreq = new ArtRec();
        artRecreq.setConfig(salePartner.getId());
        artRecreq.setAccountId(goodsInfoAndAttrValueDto.getId());
        List<ArtRec> artRecs = artRecMapper.selectArtRecList(artRecreq);
        ArtRec artRec = artRecs.get(0);
        Map<String,Object> params = new HashMap<>();
        String url = "http://new.cytds.com/api/under";
        String key = "jianhuncece";
        String secret = "1008a2e7cc233c9f4ea81ee712af0a92";
        params.put("key", salePartner.getSaleKey());
        params.put("secret", salePartner.getOther());
        params.put("my_code",artRec.getOutid());
        String response = HttpUtils.doPostFormData(url, params, null);
        log.info("畅游堂删除接口返回参数={}", MapUntils.unicodeToString(response));
        JSONObject resultJson = JSONObject.parseObject(response);
        Map<String, Object> result = new HashMap<>();
        if (!"true".equals(resultJson.getString("state"))) {
            result.put("code", 500);
        } else {
            result.put("code", 200);
        }
        result.put("req", JSONObject.toJSONString(params));
        result.put("res", response);
        result.put("msg", resultJson.getString("msg"));
        return AjaxResult.success(result);
    }

    //上架
    public static String upper(String outId, SalePartner salePartner){
        Map<String,Object> params = new HashMap<>();
        String url = "http://new.cytds.com/api/upper";
        String key = "jianhuncece";
        String secret = "1008a2e7cc233c9f4ea81ee712af0a92";
        params.put("key",key);
        params.put("secret",secret);
        params.put("my_code",outId);
        String options = HttpUtils.doPostFormData(url, params, null);
        return MapUntils.unicodeToString(options);
    }

    public static void main(String[] args) {
        String games = getAttrs("15743");
        System.out.println(games);
    }

    public static String getAttrs(String gameId){
        Map<String,Object> params = new HashMap<>();
        String url = "http://new.cytds.com/api/getGameAttrs";
        String key = "jianhuncece";
        String secret = "1008a2e7cc233c9f4ea81ee712af0a92";
        params.put("key",key);
        params.put("secret",secret);
        params.put("id",gameId);
        String options = HttpUtils.doPostFormData(url, params, null);
        return MapUntils.unicodeToString(options);
    }

    public static String getGames(){
        Map<String,Object> params = new HashMap<>();
        String url = "http://new.cytds.com/api/getGameList";
        String key = "jianhuncece";
        String secret = "1008a2e7cc233c9f4ea81ee712af0a92";
        params.put("key",key);
        params.put("secret",secret);
        String options = HttpUtils.doPostFormData(url, params, null);
        return MapUntils.unicodeToString(options);
    }

}
